package com.seafood.service;

import com.seafood.dto.FileUploadDTO;
import com.seafood.dto.FileUploadRequestDTO;
import com.seafood.dto.FileUploadResponseDTO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 文件上传服务接口
 */
public interface FileUploadService {
    
    /**
     * 上传单个文件
     */
    FileUploadResponseDTO uploadFile(MultipartFile file, FileUploadRequestDTO requestDTO, Long uploaderId, String uploaderName);
    
    /**
     * 批量上传文件
     */
    List<FileUploadResponseDTO> uploadFiles(List<MultipartFile> files, FileUploadRequestDTO requestDTO, Long uploaderId, String uploaderName);
    
    /**
     * 根据ID获取文件信息
     */
    FileUploadDTO getFileById(Long id);
    
    /**
     * 根据业务类型和业务ID获取文件列表
     */
    List<FileUploadDTO> getFilesByBusiness(String businessType, Long businessId);
    
    /**
     * 根据上传者获取文件列表（分页）
     */
    Page<FileUploadDTO> getFilesByUploader(Long uploaderId, Pageable pageable);
    
    /**
     * 根据文件类型获取文件列表（分页）
     */
    Page<FileUploadDTO> getFilesByType(String fileType, Pageable pageable);
    
    /**
     * 获取公开文件列表（分页）
     */
    Page<FileUploadDTO> getPublicFiles(Pageable pageable);
    
    /**
     * 搜索文件
     */
    Page<FileUploadDTO> searchFiles(String keyword, Pageable pageable);
    
    /**
     * 获取热门下载文件
     */
    Page<FileUploadDTO> getPopularFiles(Pageable pageable);
    
    /**
     * 获取最近上传的文件
     */
    Page<FileUploadDTO> getRecentFiles(Pageable pageable);
    
    /**
     * 下载文件（记录下载次数）
     */
    byte[] downloadFile(Long fileId);
    
    /**
     * 删除文件（软删除）
     */
    void deleteFile(Long fileId, Long operatorId);
    
    /**
     * 批量删除文件
     */
    void deleteFiles(List<Long> fileIds, Long operatorId);
    
    /**
     * 物理删除文件
     */
    void physicalDeleteFile(Long fileId);
    
    /**
     * 更新文件信息
     */
    FileUploadDTO updateFileInfo(Long fileId, String description, String tags, Boolean isPublic);
    
    /**
     * 生成缩略图
     */
    String generateThumbnail(Long fileId, Integer width, Integer height);
    
    /**
     * 检查文件是否存在（根据MD5去重）
     */
    FileUploadResponseDTO checkFileExists(String fileMd5);
    
    /**
     * 获取文件统计信息
     */
    Map<String, Object> getFileStatistics();
    
    /**
     * 获取用户文件统计
     */
    Map<String, Object> getUserFileStatistics(Long uploaderId);
    
    /**
     * 清理孤立文件
     */
    void cleanupOrphanFiles();
    
    /**
     * 验证文件类型
     */
    boolean isAllowedFileType(String contentType, String businessType);
    
    /**
     * 验证文件大小
     */
    boolean isAllowedFileSize(Long fileSize, String businessType);
}